package com.xhui.vimarket.zkplus.utils;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.event.MouseEvent;
import org.zkoss.zul.A;
import org.zkoss.zul.Bandbox;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listheader;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Menupopup;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import com.xhui.vimarket.common.utils.date.DateUtil;
import com.xhui.vimarket.common.utils.reflect.ClassUtil;
import com.xhui.vimarket.common.utils.string.StrUtil;
import com.xhui.vimarket.zkplus.utils.zul.ListboxUtils;
import com.xhui.vimarket.zkplus.zul.textbox.TextboxPlus;

/**
 * Zk界面工具类.
 * 
 * @版权：福富软件 版权所有 (c) 2011
 * @author wuyx
 * @version Revision 1.0.0
 * @see:
 * @创建日期：2011-2-22
 * @功能说明：
 * 
 */
public final class ZkUiUtil {
    /**
     * log.
     */
    public static Logger                     log                                 = Logger
                                                                                     .getLogger(ZkUiUtil.class);
    /**
     * 置灰控件map.
     */
    private static final Map<Object, Object> DEF_DISABLED_COMP_MAP               = new HashMap<Object, Object>();
    /**
     * 屏蔽右键 不弹出自定义的右键菜单
     */
    public static String                     DISPLAY_COPY_CONTEXT_MOLD_NONE_MENU = "noneMenu";
    /**
     * 屏蔽右键 弹出自定义的右键菜单
     */
    public static String                     DISPLAY_COPY_CONTEXT_MOLD_MENU      = "menu";
    
    /**
     * 构造函数.
     */
    private ZkUiUtil() {
    }
    
    /**
     * 初始化静态变量值.
     */
    static {
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Textbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(TextboxPlus.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Listbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Checkbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Button.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Toolbarbutton.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Longbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Datebox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Intbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Bandbox.class, "1");
        ZkUiUtil.DEF_DISABLED_COMP_MAP.put(Radio.class, "1");
    }
    
    /**
     * 设置容器只读.
     * 
     * @param comp Component
     * @param tf boolean
     * @author wuyx
     * 2011-2-22 wuyx 
     */
    public static void setDisabled(final Component comp, final boolean tf) {
        ZkUiUtil.setDisabled(comp, tf, ZkUiUtil.DEF_DISABLED_COMP_MAP);
    }
    
    /**
     * 设置容器只读.
     * 
     * @param comp Component
     * @param tf boolean
     * @param compMap Map
     * @author wuyx
     * 2011-2-22 wuyx 
     */
    @SuppressWarnings("unchecked")
    public static void setDisabled(final Component comp, final boolean tf,
        final Map<Object, Object> compMap) {
        if (comp != null) {
            if (compMap.containsKey(comp.getClass())) {
                if (ClassUtil.isAssignableFrom(comp.getClass(), Textbox.class)) {
                    ((Textbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), TextboxPlus.class)) {
                    ((TextboxPlus) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Listbox.class)) {
                    ((Listbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Checkbox.class)) {
                    ((Checkbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Button.class)) {
                    ((Button) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Toolbarbutton.class)) {
                    ((Toolbarbutton) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Longbox.class)) {
                    ((Longbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Datebox.class)) {
                    ((Datebox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Intbox.class)) {
                    ((Intbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Bandbox.class)) {
                    ((Bandbox) comp).setDisabled(tf);
                } else if (ClassUtil.isAssignableFrom(comp.getClass(), Radio.class)) {
                    ((Radio) comp).setDisabled(tf);
                }
            } else {
                final List<Component> childComp = comp.getChildren();
                if (childComp != null) {
                    for (final Component subComp : childComp) {
                        ZkUiUtil.setDisabled(subComp, tf, compMap);
                    }
                }
            }
        }
    }
    
    /**
     * 获取URL时间戳.
     * 
     * @param preStr String
     * @return String
     * @author wuyx
     * 2011-2-24 wuyx 
     */
    public static String getTimeSpan(String preStr) {
        return preStr + "t=" + new Date().getTime();
    }
    
    /**
     * getCompStr.
     * 
     * @param comp Component
     * @return String
     * @author wuyx
     * 2011-3-31 wuyx 
     */
    public static String getCompStr(Component comp) {
        StringBuffer sbf = new StringBuffer();
        getCompStr(comp, sbf);
        return sbf.toString();
    }
    
    /**
     * getCompStr.
     * 
     * @param comp Component
     * @param sbf StringBuffer
     * @author wuyx
     * 2011-3-31 wuyx 
     */
    private static void getCompStr(Component comp, StringBuffer sbf) {
        if (comp != null) {
            sbf.append("<");
            sbf.append(comp.getWidgetClass());
            sbf.append(" uuid=\"");
            sbf.append(comp.getUuid());
            sbf.append("\">");
            if (comp.getChildren() != null) {
                for (Object subcomp : comp.getChildren()) {
                    getCompStr((Component) subcomp, sbf);
                }
            }
            sbf.append("</");
            sbf.append(comp.getWidgetClass());
            sbf.append(">");
        }
    }
    
    /**
     * Object.
     * 
     * @param urlps String
     * @param key String
     * @return Object{null,String, String[]}
     * @author wuyx
     * 2011-4-3 wuyx 
     */
    public static Object getUrlParam(String urlps, String key) {
        Map<String, Object> args = new HashMap<String, Object>();
        if (urlps != null && urlps.indexOf("?") < 0) {
            urlps = "?" + urlps;
        }
        if ((urlps + "").indexOf("?") > -1) {
            final String[] strs = (urlps + "").split("\\?");
            if (strs.length > 1) { // ?后面数据
                final String paramStr = strs[1];
                final String[] paramStrs = paramStr.split("&");
                final int sum = paramStrs.length;
                for (int j = 0; j < sum; j++) { // 每个&数据
                    if (("" + paramStrs[j]).equals("")) { // 空数据，继续
                        continue;
                    }
                    final String[] oneStrs = ("" + paramStrs[j]).split("=");
                    args.put(oneStrs[0], oneStrs.length > 1 ? oneStrs[1]
                        : "");
                }
            }
            return args.get(key);
        }
        return null;
    }
    
    /**
     * 
     * 方法功能:
     *   屏蔽右键菜单 和ctrl+C,ctrl+x..
     * @param comp
     * @param label
     * @param mold   -- noneMenu 不弹出自定义菜单 menu弹出自定义菜单
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-10-26 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void setCompDisableCopy(Component comp, String label, String mold) {
        setDisableCtrlKeys(comp);
        if (DISPLAY_COPY_CONTEXT_MOLD_NONE_MENU.equals(mold)) {
            setDisableContext(comp);
        } else if (DISPLAY_COPY_CONTEXT_MOLD_MENU.equals(mold)) {
            setDisableContext(comp, label);
        }
    }
    
    /**
     *     
     * 方法功能:
     * 屏蔽ctrl+C,ctrl+x. .
     * @param comp
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-10-26 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void setDisableCtrlKeys(Component comp) {
        if (comp == null) {
            return;
        }
        if (ClassUtil.isAssignableFrom(comp.getClass(), Textbox.class)) {
            ((Textbox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), TextboxPlus.class)) {
            ((TextboxPlus) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Listbox.class)) {
            //     ((Listbox) comp).setCtrlKeys(str);
            setDisableCtrlKeys4Listbox((Listbox) comp);
            return;
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Checkbox.class)) {
            ((Checkbox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Button.class)) {
            ((Button) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Toolbarbutton.class)) {
            ((Toolbarbutton) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Longbox.class)) {
            ((Longbox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Datebox.class)) {
            ((Datebox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Intbox.class)) {
            ((Intbox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Bandbox.class)) {
            ((Bandbox) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Radio.class)) {
            ((Radio) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Window.class)) {
            ((Window) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Div.class)) {
            ((Div) comp).setCtrlKeys(ZkConstants.CTRLKEYS);
        } else {
            return;
        }
        listeneronCtrlKey(comp);
    }
    
    /**
     * 
     * 方法功能:
     * 屏蔽ctrl+C,ctrl+x. 对listbox必须对每个listcell进行屏蔽 解决 鼠标点击在空白处可以选择到文本，此时不松开鼠标按下ctrl+c可以复制 .
     * @param comp
     * @param str
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-10-31 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void setDisableCtrlKeys4Listbox(Listbox listbox) {
        if (listbox == null || listbox.getItemCount() <= 0) {
            return;
        }
        for (int i = listbox.getItemCount() - 1; i >= 0; i--) {
            Listitem item = listbox.getItemAtIndex(i);
            Component cmp = item;
            Iterator it = cmp.getChildren().iterator();
            while (it.hasNext()) {
                Listcell cell = (Listcell) it.next();
                String label = cell.getLabel();
                cell.setLabel(null);
                Textbox textbox = createTextbox(label);
                textbox.setParent(cell);
                listeneronCtrlKey(textbox);
            }
            
        }
        
    }
    
    /**
     * 
     * 方法功能:
     *  .
     * @param label
     * @return
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-2 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static Textbox createTextbox(String label) {
        Textbox textbox = new Textbox();
        textbox.setValue(label);
        textbox.setReadonly(true);
        textbox.setStyle("border:0;background:transparent;");
        textbox.setCtrlKeys(ZkConstants.CTRLKEYS);
        return textbox;
    }
    
    /**]
     * 
     * 方法功能:
     *  监听onCtrlKey事件.
     * @param comp
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-2 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    private static void listeneronCtrlKey(Component comp) {
        comp.addEventListener(Events.ON_CTRL_KEY, new EventListener() {
            public void onEvent(Event event) throws Exception {
                KeyEvent ke = ((KeyEvent) event);
                // System.out.println(ke.getKeyCode());
                
            }
        });
    }
    
    /**
     * 
     * 方法功能:
     *  屏蔽右键菜单 弹出自定义的菜单..
     * @param comp
     * @param label
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-10-27 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void setDisableContext(Component comp, String label) {
        if (comp == null) {
            return;
        }
        String str = "myPopUp";
        if (comp.getRoot().getFellowIfAny(str) == null) {
            Menupopup pop = new Menupopup();
            pop.setId(str);
            Menuitem item = new Menuitem();
            item.setSrc("/public/images/pub_button/inProgress.png");
            item.setLabel(label);
            item.setParent(pop);
            pop.setParent(comp.getRoot());
        }
        if (ClassUtil.isAssignableFrom(comp.getClass(), Textbox.class)) {
            ((Textbox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), TextboxPlus.class)) {
            ((TextboxPlus) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Listbox.class)) {
            ((Listbox) comp).setContext(str);
            
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Checkbox.class)) {
            ((Checkbox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Button.class)) {
            ((Button) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Toolbarbutton.class)) {
            ((Toolbarbutton) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Longbox.class)) {
            ((Longbox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Datebox.class)) {
            ((Datebox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Intbox.class)) {
            ((Intbox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Bandbox.class)) {
            ((Bandbox) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Radio.class)) {
            ((Radio) comp).setContext(str);
        } else if (ClassUtil.isAssignableFrom(comp.getClass(), Window.class)) {
            ((Window) comp).setContext(str);
        } else {
            return;
        }
        
    }
    
    /**
    * 
    * 方法功能:
    * 屏蔽右键菜单 .
    * @param comp
    * @param label
    * @author: chenmq
    * @修改记录： 
    * ==============================================================<br>
    * 日期:2011-10-26 chenmq 创建方法，并实现其功能
    * ==============================================================<br>
    */
    public static void setDisableContext(Component comp) {
        comp.addEventListener(Events.ON_RIGHT_CLICK, new EventListener() {
            public void onEvent(Event event) throws Exception {
                
            }
        });
    }
    
    /**
    * 
    * 方法功能:
    * 屏蔽左键选择 .
    * @param comp
    * @param label
    * @author: chenmq
    * @修改记录： 
    * ==============================================================<br>
    * 日期:2011-10-26 chenmq 创建方法，并实现其功能
    * ==============================================================<br>
    */
    public static void setDisableSelect(Component comp) {
        comp.addEventListener(Events.ON_CLICK, new EventListener() {
            public void onEvent(Event event) throws Exception {
                MouseEvent ke = (MouseEvent) event;
                System.out.println(ke.getKeys());
            }
        });
    }
    
    /**
     * 
     * 
     *  方法功能:
       * list数据集合中指定条件的值在listbox中展示，支持分页查询
       * 应用场景举例：把attr_value中的数据展现在页面的listbox中
       * 用此方法注意listhead的value的值需要与list中的对象的声明的属性命名一致.
       * 如NodeVo 中有个属性：name要在listbox中展现出来，则只需在listbox中添加
       * <listheader label="学校名称" value="name" />即可.
       * 如果是要展示对象中的对象则value命名用.隔开 如value=object.name
     * @param list
     * @param listbox
     * @param params
     * @param appendMap 宽展字段 
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void renderListDataAtListbox(List list, Listbox listbox,
        Map<String, Object> params) {
        ListboxUtils.clearListbox(listbox);
        if (list == null || list.size() < 1 || listbox == null) {
            return;
        }
        Component comp = listbox.getNextSibling();
        int eIndex = 0;//展示终止数
        int bIndex = 0;//展示起始数
        List dataList = filterData(list, params);
        if (comp instanceof Paging) {
            Paging paging = (Paging) comp;
            bIndex = paging.getActivePage() * paging.getPageSize();
            eIndex = (paging.getActivePage() + 1) * paging.getPageSize();
            if (eIndex > dataList.size()) {
                eIndex = dataList.size();
            }
            paging.setTotalSize(dataList.size());
            
        } else {
            eIndex = dataList.size();
        }
        renderData(dataList, listbox, bIndex, eIndex);
    }
    
    /**
     * 
     * 
     *  方法功能:
       * list数据集合全部在listbox中展示        不做分页处理
       * 应用场景举例：把attr_value中的数据展现在页面的listbox中
       * 用此方法注意listhead的value的值需要与list中的对象的声明的属性命名一致.
       * 如NodeVo 中有个属性：name要在listbox中展现出来，则只需在listbox中添加
       * <listheader label="学校名称" value="name" />即可.
       * 如果是要展示对象中的对象则value命名用.隔开 如value=object.name
     * @param list
     * @param listbox
     * @param params
     * @param appendMap 扩展字段 
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void renderListDataAtListbox(List list, Listbox listbox, Integer totalCount,
        Map<String, Object> params) {
        ListboxUtils.clearListbox(listbox);
        if (list == null || list.size() < 1 || listbox == null) {
            return;
        }
        if (totalCount == null) {
            totalCount = list.size();
        }
        Component comp = listbox.getNextSibling();
        List dataList = filterData(list, params);
        if (comp instanceof Paging) {
            Paging paging = (Paging) comp;
            paging.setTotalSize(totalCount);
        }
        renderData(dataList, listbox);
    }
    
    /**
     * 
     * 方法功能:
     *  条件过滤数据.
     * @param list
     * @param params
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static List filterData(List list, Map<String, Object> params) {
        List relList = new ArrayList();
        if (params == null || params.size() < 1) {
            return list;
        }
        Object[] keys = params.keySet().toArray();
        for (Object obj : list) {
            try {
                boolean bool = true;
                for (int i = 0; i < keys.length; i++) {
                    String key = keys[i] + "";
                    Object param = params.get(key);
                    if (param != null) {
                        String val = StrUtil.strnull(PropertyUtils.getNestedProperty(obj, key));
                        String str = param + "";
                        if (str.startsWith("%") && str.endsWith("%")) {//模糊查询
                            str = str.substring(1, str.length() - 1);
                            if (val.indexOf(str) == -1) {
                                bool = false;
                                break;
                            }
                        } else {
                            if (!param.equals(val)) {
                                bool = false;
                                break;
                            }
                        }
                        
                    }
                }
                if (bool) {
                    relList.add(obj);
                }
            } catch (Exception e) {
                log.error(e.toString());
            }
        }
        
        return relList;
    }
    
    /**
     * 
     * 方法功能:
     * 把值绑定在页面显示.
     * @param list
     * @param listbox
     * @param bIndex
     * @param eIndex
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    private static void renderData(List list, Listbox listbox, int bIndex, int eIndex) {
        ListboxUtils.clearListbox(listbox);
        List<Component> listhead = listbox.getListhead().getChildren();
        for (int i = bIndex; i < eIndex; i++) {
            Listitem item = new Listitem();
            item.setValue(list.get(i));
            //有问题
            //createListCell(list.get(i), item, listhead);
            //item.setParent(listbox);
        }
        
    }
    
    /**
    * 
    * 方法功能:
    * 把值绑定在页面显示.
    * @param list
    * @param listbox
    * @param bIndex
    * @param eIndex
    * @author: chenmq
    * @修改记录： 
    * ==============================================================<br>
    * 日期:2011-11-7 chenmq 创建方法，并实现其功能
    * ==============================================================<br>
    */
    private static void renderData(List list, Listbox listbox) {
        ListboxUtils.clearListbox(listbox);
        List<Component> listhead = listbox.getListhead().getChildren();
        for (int i = 0; i < list.size(); i++) {
            Listitem item = new Listitem();
            item.setValue(list.get(i));
            //有问题 20130720
            //createListCell(list.get(i), item, (List<Listheader>)listhead);
            //item.setParent(listbox);
        }
        
    }
    
    /**
     * 
     * 方法功能:
     *  .
     * @param bean
     * @param item
     * @param listhead
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    private static void createListCell(Object bean, final Listitem item, List<Listheader> listhead) {
        if (listhead == null || listhead.size() < 1) {
            return;
        }
        String javaCode = "";
        String type = "";
        for (Listheader header : listhead) {
            try {
                String tmp = header.getValue() + "";
                if (tmp.indexOf("_") != -1) {
                    javaCode = tmp.substring(0, tmp.indexOf("_"));
                    type = tmp.substring(tmp.indexOf("_") + 1, tmp.length());
                } else {
                    javaCode = tmp;
                }
                String val = "";
                Object objVal;
                if (javaCode.indexOf(".") != -1) {
                    String objName = javaCode.substring(0, javaCode.indexOf("."));
                    Object obj = PropertyUtils.getNestedProperty(bean, objName);
                    javaCode = javaCode.substring(javaCode.indexOf(".") + 1);
                    objVal = PropertyUtils.getNestedProperty(obj, javaCode);
                    
                } else {
                    objVal = PropertyUtils.getNestedProperty(bean, javaCode);
                }
                if (objVal != null && objVal instanceof Date) {
                    val = DateUtil.dateTimeToStr((Date) objVal);
                } else {
                    val = StrUtil.strnull(objVal);
                }
                Listcell cell = new Listcell();
                if (type.toLowerCase().equals("a")) {//超链接
                    A a = new A();
                    a.addEventListener(Events.ON_CLICK, new EventListener() {
                        @Override
                        public void onEvent(Event event) throws Exception {
                            Events.postEvent(ZkConstants.ONACLICK_EVENT, item.getParent(), item
                                .getValue());
                        }
                    });
                    a.setStyle("color:blue;text-decoration:underline;");
                    a.setLabel(val);
                    a.setParent(cell);
                } else {
                    cell.setLabel(val);
                }
                cell.setParent(item);
            } catch (Exception e) {
                Listcell cell = new Listcell();
                cell.setLabel(e.toString().substring(e.toString().indexOf(":") + 1,
                    e.toString().length()));
                cell.setParent(item);
                log.error(e.toString());
                
            }
            
        }
    }
    
    /**
     * 
     * 方法功能:
     *  获取文本高度.
     * @param text
     * @param len
     * @return
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-18 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static int getTextHight(String text, int len) {
        int lines = text.length() / len + 1;
        int height = lines * 17;
        return height;
    }
    
}
